import java.util.ArrayList;

public class Test {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(10);
        list.add(11);
        list.add(12);
        list.add(1,999999999);
        System.out.println(list);
        //这个时候打印的不是地址，而是数组，这是因为ArrayList的继承关系，因为ArrayList继承于AbstractList，
        //但是AbstractList继承于AbstractCollection，我们看到AbstractCollection中有toString的方法的重写


        //ArrayList底层是一段连续的空间，并且可以动态扩容，是一个动态类型的顺序表

        /*
        ArrayList中的部分源码：
        private static final int DEFAULT_CAPACITY = 10;//默认容量
        private static final Object[] EMPTY_ELEMENTDATA = {};//置空数组

        private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};//默认容量置空数组

        transient Object[] elementData; //类似于我们自己实现的顺寻表中的array数组，这个是真正存放数据的数组

        private int size; //类似于usedSize

         */


        /*
        ArrayList中的构造方法：

        第一个构造：
        public ArrayList(int initialCapacity) {
            if (initialCapacity > 0) {
                this.elementData = new Object[initialCapacity];//表示数组的容量为这个参数
            } else if (initialCapacity == 0) {
                this.elementData = EMPTY_ELEMENTDATA;//如果这个数据为0，那么就是一个置空数组
            } else {
                throw new IllegalArgumentException("Illegal Capacity: "+
                                                   initialCapacity);//抛出异常
        }


        第二个构造：
        public ArrayList() {
            this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;//这个数组就等于那个默认容量置空数组
        }


//        list.add(10);
//        list.add(11);
//        list.add(12);
//        list.add(1,999999999);
//        System.out.println(list);
//        但是我们通过add等这些的一系列的方法添加的数据那么会存放在哪里呢？


        第三个构造：
        //c是Collection的对象,?是通配符，在泛型进阶会讲到
        //上界的E,要传入的参数是E的子类或者E的的本身
        public ArrayList(Collection<? extends E> c) {
            Object[] a = c.toArray();
            if ((size = a.length) != 0) {
                if (c.getClass() == ArrayList.class) {
                    elementData = a;
                } else {
                    elementData = Arrays.copyOf(a, size, Object[].class);
                }
            } else {
                // replace with empty array.
                elementData = EMPTY_ELEMENTDATA;
            }
        }
         */
        ArrayList<Integer> list1 = new ArrayList<>(list);
        //这个时候就是第三个构造，list作为参数，但是list类型就是Integer的类型的，并且在实例化时我们已经确定传入了Integer类型，所以上界就是Integer类型
        list1.add(99999999);
        System.out.println(list1);
    }
    
    
}
